package cn.xenosp.server.module.menu.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.xenosp.server.common.tools.IdUtil;
import cn.xenosp.server.common.tools.ObjectConvert;
import cn.xenosp.server.module.menu.entity.SysMenu;
import cn.xenosp.server.module.menu.entity.SysMenuVO;
import cn.xenosp.server.module.menu.mapper.SysMenuMapper;
import cn.xenosp.server.module.menu.service.SysMenuService;
import cn.xenosp.server.module.roleMenu.entity.SysRoleMenu;
import cn.xenosp.server.module.roleMenu.mapper.SysRoleMenuMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* @author TongHui
* @description 针对表【sys_menu(菜单权限表)】的数据库操作Service实现
* @createDate 2024-10-20 19:57:50
*/
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
    implements SysMenuService{

    @Autowired
    SysRoleMenuMapper sysRoleMenuMapper;

    @Override
    public IPage getPage(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
        Page page = new Page(sysMenuVO.getPage(), sysMenuVO.getLimit());
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
        IPage iPage = baseMapper.page(page, sysMenu);
        List records = iPage.getRecords();
        for (Object record : records) {
            sysMenu = (SysMenu) record;
            sysMenu.setChildren(baseMapper.selectByParentId(sysMenu.getId()));
        }
        return iPage;
    }

    @Override
    public List<SysMenu> getListById(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
//        sysMenu.setParentId(sysMenuVO.getParentId());
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
//        IPage page = baseMapper.page(new Page(0, 100), sysMenu);
//        return page.getRecords();
        List<SysMenu> list = baseMapper.list(sysMenu);
        for (SysMenu menu : list) {
            String id = menu.getId();
            List<SysMenuVO> sysMenus = baseMapper.selectByParentId(id);
            menu.setChildren(sysMenus);
        }
        return list;
    }

    @Override
    public void save(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
        sysMenu.setId(IdUtil.getId());
        save(sysMenu);
    }

    @Override
    public void update(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
        updateById(sysMenu);

        sysRoleMenuMapper.update(new LambdaUpdateWrapper<SysRoleMenu>()
                .set(ObjectUtil.isNotEmpty(sysMenu.getName()),SysRoleMenu::getName,sysMenu.getName())
                .set(ObjectUtil.isNotEmpty(sysMenu.getPermission()),SysRoleMenu::getPermission,sysMenu.getPermission())
                .set(ObjectUtil.isNotEmpty(sysMenu.getType()),SysRoleMenu::getType,sysMenu.getType())
                .set(ObjectUtil.isNotEmpty(sysMenu.getIcon()),SysRoleMenu::getIcon,sysMenu.getIcon())
                .set(ObjectUtil.isNotEmpty(sysMenu.getSort()),SysRoleMenu::getSort,sysMenu.getSort())
                .set(ObjectUtil.isNotEmpty(sysMenu.getParentId()),SysRoleMenu::getParentId,sysMenu.getParentId())
                .set(ObjectUtil.isNotEmpty(sysMenu.getComponent()),SysRoleMenu::getComponent,sysMenu.getComponent())
                .set(ObjectUtil.isNotEmpty(sysMenu.getVisible()),SysRoleMenu::getVisible,sysMenu.getVisible())
                .eq(SysRoleMenu::getMenuId,sysMenu.getId()));
    }

    @Override
    public void updateStatus(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
        updateById(sysMenu);

        if (sysMenu.getStatus() == 0){
            sysRoleMenuMapper.delete(new LambdaUpdateWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getMenuId,sysMenu.getId())
                    .or()
                    .eq(SysRoleMenu::getParentId,sysMenu.getId()));
        }
    }

    @Override
    public void delete(SysMenuVO sysMenuVO) {
        SysMenu sysMenu = new SysMenu();
        ObjectConvert.copyVoToEntity(sysMenuVO,sysMenu);
        removeById(sysMenu);

        sysRoleMenuMapper.delete(new LambdaUpdateWrapper<SysRoleMenu>()
                .eq(SysRoleMenu::getMenuId,sysMenu.getId()));
    }

    @Override
    public List<SysMenu> getAllParentResources(SysMenuVO sysMenuVO) {
        return list(new LambdaQueryWrapper<SysMenu>()
                .ne(SysMenu::getType,3)
                .ne(ObjectUtil.isNotEmpty(sysMenuVO.getId()), SysMenu::getId, sysMenuVO.getId())
                .orderByAsc(SysMenu::getSort)
        );
    }
}




